#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>


//练习1：
//题目要求：接收一个无符号整型，利用递归按照顺序打印它的每一位，例如，输入：1234
//输出：1 2 3 4
void print(size_t num)
{
	if (num >= 10)
	{
		print(num / 10);
		printf("%zd ", num % 10);
	}
	else
	{
		printf("%zd ", num);
	}
	
}
//print("1 2 3 ")                          printf("4 ")
//print("1 2 ")              printf("3 ")  printf("4 ")
//print("1 ")  printf("2 ")  printf("3 ")  printf("4 ")
int main()
{
	size_t num = 0;
	scanf("%zd", &num);
	print(num);

	return 0;
}

//练习2：用递归求字符串长度
//是一种在其定义或说明中有直接或间接调用自身的一种方法
//递归常见错误 : 栈溢出，
//防止栈溢出的方法之一：函数中要调用自身时，应该利用if语句实现递归的结束
//每次往下调用自身的函数时判断是否满足递推结束的条件，
//防止栈溢出的必要条件：1、存在限制条件，当满足这个限制条件的时候，递归不再继续
//2、每次递归调用之后越来越接近这个限制条件
//内存会分为几个区域：栈区，堆区，静态区，
//每一次函数的调用，函数的形参都会在在stack(栈)区中申请空间，
//当栈区被申请完，就会出现栈溢出这个错误

int myStrlen(char* arr)
{
	if (*arr != 0)
	{
		int m = myStrlen(arr + 1) + 1;
		return myStrlen(arr + 1) + 1;
	}
	else
	{
		return 0;
	}
}
//"ello"                            + m("h")
//"llo"                    + m("e") + m("h")
//"lo"            + m("l") + m("e") + m("h")
//"o"      m("l") + m("l") + m("e") + m("h")
//m("o") + m("l") + m("l") + m("e") + m("h")
int main()
{
	char arr[] = { "hello"};
	int r = myStrlen(arr);
	printf("%d\n", r);
	return 0;
}


//递归是一种特殊的循环，递归在某些时候效率较低，比如：求第n个斐波那契数
int fib(int x)
{
    if (x <= 2)
    {
        return 1;//
    }
    else
    {
        return fib(x - 1) + fib(x - 2);//
    }
}
int main()
{
    int n = 0;//
    scanf("%d", &n);//
    int ret = fib(n);//
    printf("%d\n", ret);//
    return 0;//
}

//此时可以多创建几个变量，利用while循环，要求第i个斐波那契数
//将第i - 2个斐波那契数用a存放，将第i - 1个斐波那契数用1存放，相加得i个斐波那契数
//int fib(int x)
//{
//    int a = 1;//
//    int b = 1;//
//    int c = 1;//
//    while (x >= 3)//当输入的数字小于3时，斐波那契数均为1，返回c的值即可
//    {
//        c = a + b;//第i次循环体才执行第一句时,a的值是第i-2次的c的值,b的值是第i-1次的c的值
//        a = b;//
//        b = c;//第i次循环体执行完以后，a的值是第i-1次的c的值,b的值是第i次的c的值
//        x--;//利用减减实现，循环的次数刚好是x-3+1次
//    }
//    return c;//
//}
//求斐波那契数也可以用如下的循环方式，
int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	int i = 0;
	for ( i = 0; i < n; i++)
	{
		a = b;
		b = c;
		c = a + b;
	}
	return a;
}
//int main()
//{
//    int n = 0;//
//    scanf("%d", &n);//
//    int ret = fib(n);//
//    printf("%d\n", ret);//
//    return 0;//
//}